package com.review.math;

public class Base {
    // 一个char[]对象
    private static char[] array = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
            .toCharArray();

    public static String myDec(int number, int n) {
        // String 是不可变的，每次改变都要新建一个Strng，很浪费时间。
        // StringBuilder是‘可变的String’ ,
        StringBuilder result = new StringBuilder();
        // 模拟计算进制的过程
        while (number > 0) {
            result.insert(0, array[number % n]);
            number /= n;
        }
        return result.toString();
    }

    public static void main(String[] args) {
        int n = 18;
        System.out.println(n + "的二进制是:" + Integer.toBinaryString(n));
        System.out.println(n + "的八进制是:" + Integer.toOctalString(n));
        System.out.println(n + "的十六进制是:" + Integer.toHexString(n));
        System.out.println(n + "的三进制是:" + Integer.toString(n, 3));

        System.out.println(n + "的二进制是:" + myDec(18, 2));

        System.out.println(Integer.parseInt(Integer.toHexString(n), 16));


        String s = "10101";//1+4+16==21
        System.out.println(Integer.parseInt(s, 2));//结果是21
        // Integer 中封装好了一个方法：
        // 能够直接计算二进制中的1的个数，在竞赛中很有用.
        // JDk8中的实现方法使用的是 & 操作，所以比正常的遍历要快的多.
        System.out.println(Integer.bitCount(21));
        // 上文是21的二进制，所以21的二进制中有 3 个‘1’
    }
}
